/*
NAME: 
DESCRIPTION: 合并正负层;
PARAMETER:
    [
		{
			name: 'step_filter',
			title: 'step过滤',
			type: 'LineEdit'
		},
		{
			name: 'tol',
			title: '公差',
			type: 'LineEdit'
		},
		{
			name : 'auto_save',
			title : '自动保存',
			type : 'RadioBox',
            property : {
				item_list:[
					{name:'yes',text:'Yes'},
					{name:'no',text:'No'},
				],
				tool_tip:'是否自动保存料号开关'
			}
		},
	]
	
 VERSION_HISTORY:
	V1.00 2020-04-20 Scott Sun
	    1.新版本
		
 HELP:
 	<html><body bgcolor="#DDECFE">
		<font size="3" color="#003DB2"><p>功能简介</p></font>
		<p> 合并正负层 </p>
		<br>
		<font size="3" color="#003DB2"><p>参数配置</p></font>
		<p> </p>
		<br>
		<font size="3" color="#003DB2"><p>注意事项</p></font>
		<p> 无 </p>
		<br>
	</body></html>	
*/
//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
console.log("================================>合并正负层");
// 引入模块 包
var $ = require('topcam.scriptfunc').argv();
var fs = require('fs');
var _ = require('lodash');
var mode = $.ikm ? "topcam" : "aimdfm";
var IKM = $.ikm; 
if (IKM==undefined ) { IKM = require('topcam.ikm6')($) }
var GEN = $.gen;
var GUI = $.gui || {};
var Job = $.job || $.job_name;
var JobId = $.job_id;
var db = $.db || IKM.db
var PAR = {}
if ($.par) {
	PAR = $.par
} else if ($.hasOwnProperty('script_parameter')){
	PAR = JSON.parse($.script_parameter);
}
if (mode === "aimdfm") {
	var database = require("topsin.database");
	database.addConnection($.conf.database_conf, "DFM");
	var QDfm = database.query("DFM");
	$.QDfm = QDfm;
	if ($.conf.product_type == "aimdfm") {
		QDfm.updateRow({
			table: "pdm_aimdfm_task",
			data: {
				current_process_title: $.process_title
			},
			where: { id: $.task_id }
		});
	}
}
var Status = 'ok';
var resultData = [];
try {
	var par = PAR;
	var default_par = {
		step_filter: 'unit.+',
		step2: "unit",
        auto_save: "No",
		units: "mm",
		tol: 1
	}
	for(var key in default_par){  // 设置默认属性
		if (!par.hasOwnProperty(key) || par[key] == ""){
			par[key] = default_par[key]
		}
	}

	if(_.isEmpty(Job)){throw "参数Job不存在"}
	var job = Job.toLowerCase()
	if(!GEN.isJobExists({job:job})){throw "料号"+job+"不存在"}
	if(!GEN.isJobOpen({job:job})){ GEN.openJob({job:job}) }
    if(mode == "aimdfm"){
        if(GEN.checkInout({job:job,mode:"test"}) != 0){ throw "the job check" }
        GEN.checkInout({job:job,mode:"out"});
    }
    var matrix = GEN.getMatrix({job:job})
	var signal_and_sm_layers = Object.keys(matrix).reduce(function(a,b){  // matrix过滤出防焊和线路
        if(matrix[b].context == "board"){  // power_ground是负层
            if(matrix[b].layer_type == "signal" || matrix[b].layer_type == "power_ground" || matrix[b].layer_type == "solder_mask"){
                a.push(b)
            }            
        }
		return a;
    },[])

	var steplist = GEN.getStepList({job:job})
	steplist = steplist.filter(function(v){
		var tmpreg = new RegExp(par.step_filter,"ig")
		return tmpreg.test(v)
	})
	if (steplist.length == 0 && par.step2) {
		steplist = GEN.getStepList({job:job}).filter(function (v) {
			var tmpreg = new RegExp(par.step2, "ig");
			return tmpreg.test(v);
		})
	}
	var job_path = GEN.getJobPath({job:job})
	var report_tmp = job_path + "/compare_report";
	steplist.forEach(function(step){
		GEN.openStep({job:job,name:step})
        //料号初始化
		
		GEN.clearLayers();  //清除层显示
		GEN.affectedLayer({ mode: 'all', affected: 'no' });  //设置影响层全部不影响
		//操作模式初始化
		GEN.COM("sel_options,clear_mode=clear_after,display_mode=all_layers,area_inout=inside,area_select=select,select_mode=standard,area_touching_mode=exclude");
		GEN.units({ type: par.units });  //单位初始化
		GEN.zoomHome();  //窗口显示回到原始位置
		GEN.affectedLayer({affected:"yes", layer:signal_and_sm_layers})
		GEN.selectByFilter({polarity:"negative"})
		GEN.selectByFilter({feat_types:"surface", polarity:"positive"})
		if(GEN.getSelectCount() > 0) {
			GEN.COM("sel_cont_resize,accuracy=0,break_to_islands=yes,island_size=0,hole_size=0,drill_filter=no,corner_ctl=no")
		}

		while (!GEN.isLayerExists({job:job, layer:"_compare_ok_"})) {
			GEN.COM("stpcmp_page_open,job1="+job+",step1=orig,force_init=no,step2="+step)
			GEN.COM("stpcmp_params,area=profile");
			GEN.COM("stpcmp_control,rules1=BOARD");
			GEN.COM("stpcmp_control,rules2=BOARD");
			GEN.COM("stpcmp_compare,tol=1,area=profile,ignore_attr=,map_res=200,consider_sr=yes")
	
			GEN.COM("stpcmp_rep_save,path="+report_tmp)
			var ret = parseReport(fs.readFile(report_tmp))
	
			if(ret.length){
				IKM.msg("比对情况:\n" + ret.join("\n"))
				GEN.PAUSE("pause")
			} else {
				IKM.msg("比对无差距") 
				break
			}
		}
	})
	// steplist.forEach(function(step){
    //     GEN.openStep({job:job,name:step})
    //     //料号初始化
	// 	GEN.clearLayers();  //清除层显示
	// 	GEN.affectedLayer({ mode: 'all', affected: 'no' });  //设置影响层全部不影响
	// 	//操作模式初始化
	// 	GEN.COM("sel_options,clear_mode=clear_after,display_mode=all_layers,area_inout=inside,area_select=select,select_mode=standard,area_touching_mode=exclude");
	// 	GEN.units({ type: par.units });  //单位初始化
    //     GEN.zoomHome();  //窗口显示回到原始位置
        
    //     //逐层作业，选中负性物件
    //     signal_and_sm_layers.forEach(function(layer){
    //         GEN.workLayer({name: layer, display_number:1, clear_before:'yes'});
            
    //         // 备份层用于后面比对
    //         var layer_back = "back_" + layer;
	// 	    GEN.copyLayer({source_job:job, source_step:step, source_layer:layer, dest_layer:layer_back});

	// 		// 选中正负surface，转铜皮
	// 		GEN.COM("filter_reset,filter_name=popup")
    //         GEN.selectByFilter({
    //             'feat_types':'surface',
    //             'polarity':'positive\;negative',
    //             'include_syms':'',
    //             'exclude_syms':'',
    //             'profile':'all'
	// 		});
    //         if(GEN.getSelectCount() > 0){  
	// 			// GEN.selContourize();  // 会报错导致退出

	// 			// 此处合并正负层已经完成（如果出现结果依旧是有部分层没有转surface的情况，就将脚本参数改成yes）
    //             GEN.COM("sel_cont_resize,accuracy=0,break_to_islands=yes,island_size=0,hole_size=0,drill_filter=no,corner_ctl=no")				
	// 		}else{
	// 			return ;  // 如果没有就跳出进行下一层（是因为没有负属性的surface吗？有负属性的surface就有可能touch其他物件是吗？？）
	// 		}
	// 		// 目的：将与负属性surface相touch的pad转成sruface，再将这个surface强行转成pad？？
    //         // 选中负性物件，参考touch选中pad，选中的pad添加属性（.string=tl_pad）
	// 		GEN.selRefFeat({
	// 			'layers': layer_back,
	// 			'use':'filter',
	// 			'mode':'touch',
	// 			'polarity':'negative',
	// 			// 'f_types':'pad',  // 
	// 			'filter':{  // 注意：是参考层选中负属性物件，touch本层正属性的pad！并不是选中参考层的负属性pad来touch本层！
	// 				'feat_types': 'pad',
    // 				'polarity':'positive',
	// 			}
	// 		}) 
	// 		if(GEN.getSelectCount() > 0){
    //             GEN.COM("cur_atr_set,attribute=.string,text=tl_pad")
	// 			GEN.COM("sel_change_atr,mode=add")
	// 			GEN.selRefFeat({
	// 				'layers': layer_back,
	// 				'use':'filter',
	// 				'mode':'touch',
	// 				'polarity':'negative',
	// 				// 'f_types':'pad',  // 
	// 				'filter':{  // 注意：是参考层选中负属性物件，touch本层正属性的pad！并不是选中参考层的负属性pad来touch本层！
	// 					'feat_types': 'pad',
	// 					'polarity':'positive', 
	// 				}
	// 			}) 
	// 			GEN.COM("filter_set",{filter_name:"popup",update_popup:"no",polarity:"negative"}) 
	// 			GEN.COM("sel_ref_feat",{layers:"back_"+layer,use:"select",mode:"touch",pads_as:"shape",f_types:"line\;pad\;surface\;arc\;text",polarity:"negative"})
	// 			if(GEN.getSelectCount() > 0){
	// 				GEN.COM("cur_atr_set,attribute=.string,text=tl_pad")
	// 				GEN.COM("sel_change_atr,mode=add")
	// 			}
	// 			GEN.COM("filter_reset,filter_name=popup")
	// 		}
			
    //         // 选中line，参考touch选中负性物件添加属性（.string=tl_touch_line）
    //         GEN.selRefFeat({
	// 			'layers': layer_back,
	// 			'use':'filter',
	// 			'mode':'touch',
	// 			'polarity':'negative',
	// 			// 'f_types':'line',
	// 			'filter':{  // 问题:后面排除了此处与负属性物件相touch的line，是因为line转surface后回退不了吗？？
	// 				'feat_types': 'line',
    // 				'polarity':'positive', 
	// 			}
	// 		}) 
	// 		// GEN.PAUSE(2)
    //         if(GEN.getSelectCount() > 0){
    //             GEN.COM("cur_atr_set,attribute=.string,text=tl_touch_line")
	// 			GEN.COM("sel_change_atr,mode=add")
	// 			GEN.selRefFeat({
	// 				'layers': layer_back,
	// 				'use':'filter',
	// 				'mode':'touch',
	// 				'polarity':'negative',
	// 				// 'f_types':'line',
	// 				'filter':{  // 问题:后面排除了此处与负属性物件相touch的line，是因为line转surface后回退不了吗？？
	// 					'feat_types': 'line',
	// 					'polarity':'positive',
	// 				}
	// 			}) 
	// 			GEN.COM("filter_set",{filter_name:"popup",update_popup:"no",polarity:"negative"}) 
	// 			GEN.COM("sel_ref_feat",{layers:"back_"+layer,use:"select",mode:"touch",pads_as:"shape",f_types:"line\;pad\;surface\;arc\;text",polarity:"negative"})
	// 			if(GEN.getSelectCount() > 0){
	// 				GEN.COM("cur_atr_set,attribute=.string,text=tl_pad")
	// 				GEN.COM("sel_change_atr,mode=add")
	// 			}
	// 			GEN.COM("filter_reset,filter_name=popup")
	// 		}
	// 		// 选中负性物件，参考touch选中surface和pad （问题：此处为什么要带上surface？？前面不是转过了吗？？）
	// 		GEN.COM('filter_reset,filter_name=popup') // 刷新过滤器 
	// 		GEN.selectByFilter({
	// 			'polarity':'negative',
	// 		})
	// 		if( GEN.getSelectCount() > 0 ){
	// 			GEN.selRefFeat({  // 注意：此处是参考本层！
	// 				'use':'select',
	// 				'mode':'touch',
	// 				'f_types':'pad\;surface',
	// 				'polarity':'positive',
	// 			}) 
	// 			// GEN.PAUSE(3)
	// 			if(GEN.getSelectCount() > 0){

	// 				GEN.selectByFilter({polarity:"negative"})

	// 				GEN.selectByFilter({
	// 					// 'feat_types':'line\;pad\;surface\;arc\;text',  // 可以省略
	// 					// 'polarity':'positive\;negative',
	// 					// 'include_syms':'',
	// 					// 'exclude_syms':'',
	// 					'attribute':[{attribute:'.string', text:'tl_touch_line'}],  
	// 					'profile':'all',
	// 					'operation':'unselect'
	// 				})
	// 				// 整体表面化转铜皮
	// 				if( GEN.getSelectCount() > 0 ){
	// 					// GEN.selContourize(); //会报错导致退出
	// 					GEN.COM("sel_cont_resize,accuracy=0,break_to_islands=yes,island_size=0,hole_size=0,drill_filter=no,corner_ctl=no")
	// 				}

	// 				// 选中（.string=tl_pad）的物件，将surface物件转为pad属性物件
	// 				GEN.selectByFilter({  // 上面已经将与负属性touch的pad转了surface，此处是将属性为surface的pad再转成pad
	// 					// 'feat_types':'line\;pad\;surface\;arc\;text',
	// 					// 'polarity':'positive\;negative',
	// 					// 'include_syms':'',
	// 					// 'exclude_syms':'',
	// 					'attribute':[{attribute:'.string', text:'tl_pad'}], 
	// 					'profile':'all',
	// 				})
	// 				// GEN.PAUSE(GEN.getSelectCount())
	// 				if( GEN.getSelectCount() > 0 ){
	// 					// 最后要删除+++后缀的层吧（max_size可以设置一个大值）
	// 					GEN.COM("sel_cont2pad,match_tol=25.4,restriction=,min_size=127,max_size= 12700,suffix=+++")
	// 					// GEN.PAUSE(2)
	// 				}
	// 			}
	// 		}
			
	// 		GEN.selectByFilter({polarity:"negative"})
	// 		if(GEN.getSelectCount() > 0) {
	// 			var ne_layer = layer + "_negative"
	// 			if(GEN.isLayerExists({job:job, layer:ne_layer})){
	// 				GEN.deleteLayer({job:job, layer:[ne_layer]})
	// 			}
	// 			GEN.selCopyOther({dest:'layer_name',target_layer:ne_layer,invert:'no',dx:0,dy:0,size:0})
    //         	GEN.workLayer({name: layer, display_number:1, clear_before:'yes'});
	// 			GEN.selRefFeat({layers:ne_layer,use:"filter",mode:"include"})
	// 			if(GEN.getSelectCount() > 0) {
	// 				GEN.COM("sel_cont_resize,accuracy=0,break_to_islands=yes,island_size=0,hole_size=0,drill_filter=no,corner_ctl=no")
	// 			}
	// 		}
			
	// 		// GEN.PAUSE(4)

    //         // 不清除上一步的状态下继续选中负性物件，去除选中的（.string=tl_touch_line）物件
    //         // GEN.selectByFilter({
    //         //     // 'feat_types':'line\;pad\;surface\;arc\;text',
	// 		// 	// 'polarity':'positive\;negative',
	// 		// 	// 'include_syms':'',
	// 		// 	// 'exclude_syms':'',
	// 		// 	'attribute':[{attribute:'.string', text:'tl_touch_line'}],  
    //         //     'profile':'all',
    //         //     'operation':'unselect'
	// 		// })
			
	// 		// GEN.PAUSE(41) 
			
    //         // // 整体表面化转铜皮
    //         // if( GEN.getSelectCount() > 0 ){
    //         //     // GEN.selContourize(); //会报错导致退出
	// 		// 	GEN.COM("sel_cont_resize,accuracy=0,break_to_islands=yes,island_size=0,hole_size=0,drill_filter=no,corner_ctl=no")
	// 		// }
			
	// 		// GEN.PAUSE(5) 

    //         // // 选中（.string=tl_pad）的物件，将surface物件转为pad属性物件
    //         // GEN.selectByFilter({
    //         //     // 'feat_types':'line\;pad\;surface\;arc\;text',
	// 		// 	// 'polarity':'positive\;negative',
	// 		// 	// 'include_syms':'',
	// 		// 	// 'exclude_syms':'',
	// 		// 	'attribute':[{attribute:'.string', text:'tl_pad'}], 
    //         //     'profile':'all',
    //         // })
    //         // if( GEN.getSelectCount() > 0 ){
    //         //     // 最后要删除+++后缀的层吧（max_size可以设置一个大值）
    //         //     GEN.COM("sel_cont2pad,match_tol=25.4,restriction=,min_size=127,max_size= 12700,suffix=+++")
	// 		// }
			
	// 		// GEN.PAUSE(6)

    //         // 与备份层别比对，比对不一致的记录信息（比对层别命名: + _cmp_tl）
    //         // var cmpLayer = layer + '_cmp_tl'
    //         // GEN.compareLayers({
    //         //     layer1:layer,
    //         //     job2:job,
    //         //     step2:step,
    //         //     layer2:layer_back, 
	// 		// 	tol:par.tol,
	// 		// 	map_layer: cmpLayer,
	// 		// })
			
	// 		// // GEN.PAUSE(7)

    //         // // 对比层中没有r0的层别删除 （有r0代表不一致，那么就保留，另外将这个信息记录到resultData）==> 后面决定不删
    //         // GEN.workLayer({name: cmpLayer, display_number:1, clear_before:'yes'});
    //         // GEN.selectByFilter({
    //         //     'feat_types':'line\;pad\;surface\;arc\;text',
	// 		// 	'polarity':'positive\;negative',
	// 		// 	'include_syms':'r0',
	// 		// 	'exclude_syms':'',
    //         //     'profile':'all',
    //         // })
    //         // if(GEN.getSelectCount() > 0){
    //         //     interrupt('error', '层别对比报错!', 'step is '+step+' ,compare layer is ' + layer + ', error result in '+cmpLayer)
    //         // }else{
    //         //     // 问题： 在step中进行删除层操作时会影响到其他step的相同名的层吗？？ 答：会，因此此处不删除层
    //         //     // GEN.deleteLayer({job:job, step:step, layer:cmpLayer}) 
    //         // } 

	// 		GEN.deleteLayer({job:job, step:step, layer:layer_back}) // 删除复制的层
			
	// 		// GEN.PAUSE(8) 
    //     })

    //     // 删除后缀是+++的层
    //     var matrix = GEN.getMatrix({job:job})
    //     var suffixLayers = Object.keys(matrix).reduce(function(a,b){  
    //         if(b.slice(b.length-3) == '+++'){
    //             a.push(b)
    //         }

    //         return a;
    //     },[])
	// 	GEN.deleteLayer({job:job, step:step, layer:suffixLayers}) 

    //     GEN.clearLayers();
	// 	GEN.affectedLayer({ mode: 'all', affected: 'no' });
	// 	GEN.closeStep();
    // })


	//保存 
	if(/yes/ig.test(par.auto_save.toLowerCase())){  //
		GEN.checkInout({job:job,mode:"out"})  // 结束保存料号 关闭料号
		GEN.saveJob({ job: job });
		GEN.checkInout({job:job,mode:"in"})
		GEN.closeJob({job:job})
	} else {
		GEN.checkInout({job:job,mode:"in"})
		// GEN.closeJob({job:job})  //
	}

    if (mode === "aimdfm") {
		$.QDfm.updateRow({
			table: "pdm_aimdfm_task",
			data: {
				progress: 33.33
			},
			where: { id: $.task_id }
		});
		if (GEN.hasError()) {
			IKM.msg(_.join(GEN.STATUS, "\n"))
			Status = 'error';
			resultData.push({ type: "error", title: "GEN错误!", detail: [{ desc: _.join(GEN.STATUS, "\n") }] });
			return {
				status: Status,
				result_data: resultData
			};
		} else {
			resultData.push({ type: "info", title: "操作完成, 请注意检查!" });
			return {
				status: Status,
				result_data: resultData
			};
		}
	}else {
		return "Done"
	}  	
} catch (e) {
	IKM.msg(_.join(GEN.STATUS, "\n"))
	IKM.msg(e)
    Status = 'error';
    resultData.push({type: "error", title: "脚本执行出错!", detail: [{desc: _.toString(e)}]});
	return (mode === "aimdfm") ? {status: Status, result_data: resultData} : "Error";
}


function interrupt(type, title, detail){  // 自定义result_data信息
    resultData.push({type: type, title: title, detail: [{desc: _.toString(detail)}]});
    // return {status: type, result_data: resultData};
}

function parseReport (str) {
	var tmparr = str.split("\n")
    var ret = []
    tmparr.forEach(function(v){
        var tmp = v.trim()
        if(/^\d+\s+\S+\s+\S+\s+(\d+)$/.test(tmp)){
            if(RegExp.$1 > 0){
                ret.push(v)
            }
        }
    })
    return ret
}
